package co.com.coomeva.adminEvaluacion.modelo.util;

import java.util.Vector;

/**
 * Clase que contiene la creacion del objeto Registro que contiene los datos que
 * se consultan en la base de datos
 * @author Illustrato
 */
public class Registro {

    private String[] strValores;
    private Vector vectorContenido;

    /**
     * Constructor de la clase
     */
    public Registro() {
        strValores = new String[2];
        vectorContenido = new Vector();
    }
     
    /**
     * Agrega una columna con un valor al objeto <code>Registro</code>
     * @param strNombreColumna Nombre de la columna
     * @param strValor Valor asignado a la columna
     * @return <code>true</code> si agrega la columna satisfactoriamente. <code>false</code> en caso contrario.
     */
    @SuppressWarnings("unchecked")
    public boolean agregarColumna(String strNombreColumna, String strValor) {
        strValores = new String[2];
        strValores[0] = strNombreColumna;
        strValores[1] = strValor;
        return vectorContenido.add(strValores);
    }

    /**
     * Obtiene el valor asignado a la columna identificada con el nombre <code>strNombreColumna</code> (Case Insensitive)
     * @param strNombreColumna Nombre de la columna de la cual se quiere obtener el valor asignado
     * @return Valor de la columna.
     * @throws java.lang.Exception En el caso de que la columna <code>strNombreColumna</code> no exista
     */
    public String obtenerValor(String strNombreColumna) throws Exception {
        for (int i = 0; i < vectorContenido.size(); i++) {
            if (((String[]) vectorContenido.get(i))[0].equalsIgnoreCase(strNombreColumna)) {
                return ((String[]) vectorContenido.get(i))[1];
            }
        }
        throw new Exception("En el registro no se ha encontrado la columna \"" + strNombreColumna + "\"");
    }

    /**
     * Obtiene el valor asignado a la columna que corresponde al index <code>iNumColumna</code>
     * @param iNumColumna Numero de la columna. La primera columna es 0.
     * @return Valor de la columna
     * @throws java.lang.Exception En el caso de que <code>iNumColumna >= Registro.size()</code>
     */
    public String obtenerValor(int iNumColumna) throws Exception {
        if (vectorContenido.size() > iNumColumna) {
            return ((String[]) vectorContenido.get(iNumColumna))[1];
        } else {
            throw new IndexOutOfBoundsException("index: "+String.valueOf(iNumColumna)+" >= " + String.valueOf(vectorContenido.size()));
        }
    }

    /**
     * Obtiene el nombre de la columna que corresponde al index <code>iNumColumna</code>
     * @param iNumColumna Numero de la columna. La primera columna es 0.
     * @return Nombre de la columna
     * @throws java.lang.Exception En el caso de que <code>iNumColumna >= Registro.size()</code>
     */
    public String obtenerNombreColumna(int iNumColumna) throws Exception {
        if (vectorContenido.size() > iNumColumna) {
            return ((String[]) vectorContenido.get(iNumColumna))[0];
        } else {
            throw new IndexOutOfBoundsException("index: "+String.valueOf(iNumColumna)+" >= " + String.valueOf(vectorContenido.size()));
        }
    }

    /**
     * Establece un valor nuevo a una columna ya existente
     * @param strNombreColumna Nombre de la columna a la cual se le va a ajustar un nuevo valor
     * @param strValor Nuevo valor de la columna
     * @return <code>true</code> si ajusta el nuevo valor de la columna satisfactoriamente. <code>false</code> en caso contrario.
     * @throws java.lang.Exception En el caso de que la columna <code>strNombreColumna</code> no exista
     */
    public boolean ajustarValor(String strNombreColumna, String strValor) throws Exception {
        for (int i = 0; i < vectorContenido.size(); i++) {
            if (((String[]) vectorContenido.get(i))[0].equalsIgnoreCase(strNombreColumna)) {
                ((String[]) vectorContenido.get(i))[1] = strValor;
                return true;
            }
        }
        throw new Exception("No se ha encontrado la columna \"" + strNombreColumna + "\"");
    }

    /**
     * Establece un valor nuevo a una columna ya existente
     * @param iNumColumna Index de la columna. La primera columna es 0.
     * @param strValor Nuevo valor de la columna
     * @return <code>true</code> si ajusta el nuevo valor de la columna satisfactoriamente. <code>false</code> en caso contrario.
     * @throws java.lang.Exception En el caso de que <code>iNumColumna >= Registro.size()</code>
     */
    public boolean ajustarValor(int iNumColumna, String strValor) throws Exception {
        if (vectorContenido.size() > iNumColumna) {
            ((String[]) vectorContenido.get(iNumColumna))[1] = strValor;
            return true;
        } else {
            throw new IndexOutOfBoundsException("index: "+String.valueOf(iNumColumna)+" >= " + String.valueOf(vectorContenido.size()));
        }
    }

    /**
     * Elimina la columna del registro correspondiente al index <code>iNumColumna</code>
     * @param iNumColumna Index de la columna. La primera columna es 0.
     * @return <code>true</code> si elimina la columna satisfactoriamente
     * @throws java.lang.Exception En el caso de que <code>iNumColumna >= Registro.size()</code>
     */
    public boolean eliminarColumna(int iNumColumna) throws Exception {
        if (vectorContenido.size() > iNumColumna) {
            Object obj = vectorContenido.remove(iNumColumna);
            if (obj == null) {
                return false;
            } else {
                return true;
            }
        } else {
            throw new IndexOutOfBoundsException("index: "+String.valueOf(iNumColumna)+" >= " + String.valueOf(vectorContenido.size()));
        }
    }

    /**
     * Elimina la columna identificada con el nombre <code>strNombreColumna</code> (Case Insensitive)
     * @param strNombreColumna Nombre de la columna
     * @return <code>true</code> si elimina la columna satisfactoriamente
     * @throws java.lang.Exception En el caso de que la columna <code>strNombreColumna</code> no exista
     */
    public boolean eliminarColumna(String strNombreColumna) throws Exception {
        for (int i = 0; i < vectorContenido.size(); i++) {
            if (((String[]) vectorContenido.get(i))[0].equalsIgnoreCase(strNombreColumna)) {
                Object obj = vectorContenido.remove(i);
                if (obj == null) {
                    return false;
                } else {
                    return true;
                }
            }
        }
        throw new Exception("No se ha encontrado la columna \"" + strNombreColumna + "\"");
    }

    /**
     * Obtiene el tamaño del registro.
     * @return Numero de columnas del registro.
     */
    public int size() {
        return vectorContenido.size();
    }

    /**
     * Retorna un <code>String</code> que representa los datos contenidos por el objeto. Una instancia de
     * <code>Registro</code> es un conjunto de columnas con sus respectivos valores.
     * @return <code>String</code> que representa los datos contenidos por el objeto
     */
    @Override
    public String toString() {
        String strContenido = new String();
        for (int i = 0; i < vectorContenido.size(); i++) {
            strContenido = strContenido.concat(((String[]) vectorContenido.get(i))[0] + ": " + ((String[]) vectorContenido.get(i))[1] + "; ");
        }
        strContenido = strContenido.substring(0, strContenido.length() - 2);
        return strContenido;
    }
}
